<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8" />
  <title>Real Use Cases &raquo; Standard Cell Placement | Taskflow QuickStart</title>
  <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Source+Sans+Pro:400,400i,600,600i%7CSource+Code+Pro:400,400i,600" />
  <link rel="stylesheet" href="m-dark+documentation.compiled.css" />
  <link rel="icon" href="favicon.ico" type="image/vnd.microsoft.icon" />
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  <meta name="theme-color" content="#22272e" />
</head>
<body>
<header><nav id="navigation">
  <div class="m-container">
    <div class="m-row">
      <span id="m-navbar-brand" class="m-col-t-8 m-col-m-none m-left-m">
        <a href="https://taskflow.github.io"><img src="taskflow_logo.png" alt="" />Taskflow</a> <span class="m-breadcrumb">|</span> <a href="index.html" class="m-thin">QuickStart</a>
      </span>
      <div class="m-col-t-4 m-hide-m m-text-right m-nopadr">
        <a href="#search" class="m-doc-search-icon" title="Search" onclick="return showSearch()"><svg style="height: 0.9rem;" viewBox="0 0 16 16">
          <path id="m-doc-search-icon-path" d="m6 0c-3.31 0-6 2.69-6 6 0 3.31 2.69 6 6 6 1.49 0 2.85-0.541 3.89-1.44-0.0164 0.338 0.147 0.759 0.5 1.15l3.22 3.79c0.552 0.614 1.45 0.665 2 0.115 0.55-0.55 0.499-1.45-0.115-2l-3.79-3.22c-0.392-0.353-0.812-0.515-1.15-0.5 0.895-1.05 1.44-2.41 1.44-3.89 0-3.31-2.69-6-6-6zm0 1.56a4.44 4.44 0 0 1 4.44 4.44 4.44 4.44 0 0 1-4.44 4.44 4.44 4.44 0 0 1-4.44-4.44 4.44 4.44 0 0 1 4.44-4.44z"/>
        </svg></a>
        <a id="m-navbar-show" href="#navigation" title="Show navigation"></a>
        <a id="m-navbar-hide" href="#" title="Hide navigation"></a>
      </div>
      <div id="m-navbar-collapse" class="m-col-t-12 m-show-m m-col-m-none m-right-m">
        <div class="m-row">
          <ol class="m-col-t-6 m-col-m-none">
            <li><a href="pages.html">Handbook</a></li>
            <li><a href="namespaces.html">Namespaces</a></li>
          </ol>
          <ol class="m-col-t-6 m-col-m-none" start="3">
            <li><a href="annotated.html">Classes</a></li>
            <li><a href="files.html">Files</a></li>
            <li class="m-show-m"><a href="#search" class="m-doc-search-icon" title="Search" onclick="return showSearch()"><svg style="height: 0.9rem;" viewBox="0 0 16 16">
              <use href="#m-doc-search-icon-path" />
            </svg></a></li>
          </ol>
        </div>
      </div>
    </div>
  </div>
</nav></header>
<main><article>
  <div class="m-container m-container-inflatable">
    <div class="m-row">
      <div class="m-col-l-10 m-push-l-1">
        <h1>
          <span class="m-breadcrumb"><a href="usecases.html">Real Use Cases</a> &raquo;</span>
          Standard Cell Placement
        </h1>
        <nav class="m-block m-default">
          <h3>Contents</h3>
          <ul>
            <li><a href="#UseCasesDreamPlace">DreamPlace: GPU-accelerated Placement Engine</a></li>
            <li><a href="#UseCasesDreamPlaceProgrammingEffort">Programming Effort</a></li>
            <li><a href="#UseCasesDreamPlacePerformance">Performance</a></li>
            <li><a href="#UseCasesDreamPlaceConclusion">Conclusion</a></li>
            <li><a href="#UseCasesDreamPlaceReferences">References</a></li>
          </ul>
        </nav>
<p>We applied Taskflow to solve a VLSI placement problem. The goal is to determine the physical locations of cells (logic gates) in a fixed layout region using minimal interconnect wirelength.</p><section id="UseCasesDreamPlace"><h2><a href="#UseCasesDreamPlace">DreamPlace: GPU-accelerated Placement Engine</a></h2><p>Placement is an important step in the layout generation stage of a circuit design. It places each cell of synthesized netlists in a region and optimizes their interconnect. The following figure shows a placement layout of an industrial design, adaptec1.</p><img class="m-image" src="dreamplace_1.png" alt="Image" /><p>Modern placement typically incorporates hundreds of millions of cells and takes several hours to finish. To reduce the long runtime, recent work started investigating new CPU-GPU algorithms. We consider matching-based hybrid CPU-GPU placement refinement algorithm developed by <a href="https://github.com/limbo018/DREAMPlace">DREAMPlace</a>. The algorithm iterates the following:</p><ul><li>A GPU-based maximal independent set algorithm to identify cell candidates</li><li>A CPU-based partition algorithm to cluster adjacent cells</li><li>A CPU-based bipartite matching algorithm to find the best permutation of cell locations.</li></ul><p>Each iteration contains overlapped CPU and GPU tasks with nested conditions to decide the convergence.</p><img class="m-image" src="dreamplace_2.png" alt="Image" /></section><section id="UseCasesDreamPlaceProgrammingEffort"><h2><a href="#UseCasesDreamPlaceProgrammingEffort">Programming Effort</a></h2><p>We implemented the hybrid CPU-GPU placement algorithm using Taskflow, <a href="https://github.com/oneapi-src/oneTBB">Intel TBB</a>, and <a href="http://starpu.gforge.inria.fr/">StarPU</a>. The algorithm is crafted on one GPU and many CPUs. Since TBB and StarPU have no support for nested conditions, we unroll their task graphs across fixed-length iterations found in hindsight. The figure below shows a partial taskflow of 4 cudaFlows, 1 conditioned cycle, and 12 static tasks for one placement iteration.</p><div class="m-graph"><svg style="width: 112.700rem; height: 67.200rem;" viewBox="0.00 0.00 1126.54 671.96">
<g transform="scale(1 1) rotate(0) translate(4 667.96)">
<title>Taskflow</title>
<g class="m-cluster">
<title>cluster_p0x55f824e16950</title>
<polygon points="422.16,-358 422.16,-537 692.11,-537 692.11,-358 422.16,-358"/>
<text text-anchor="middle" x="557.14" y="-525" font-family="Helvetica,sans-Serif" font-size="10.00">cudaFlow: h2d_constant</text>
</g>
<g class="m-cluster">
<title>cluster_p0x55f824e16ea0</title>
<polygon points="404.5,-125 404.5,-304 686.61,-304 686.61,-125 404.5,-125"/>
<text text-anchor="middle" x="545.56" y="-292" font-family="Helvetica,sans-Serif" font-size="10.00">cudaFlow: [0]mis_h2d</text>
</g>
<g class="m-cluster">
<title>cluster_p0x55f824e170c0</title>
<polygon points="8,-379 8,-504 372.34,-504 372.34,-379 8,-379"/>
<text text-anchor="middle" x="190.17" y="-492" font-family="Helvetica,sans-Serif" font-size="10.00">cudaFlow: [0]mis_loop_k</text>
</g>
<g class="m-cluster">
<title>cluster_p0x55f824e173f0</title>
<polygon points="573.89,-46 573.89,-117 856.66,-117 856.66,-46 573.89,-46"/>
<text text-anchor="middle" x="715.27" y="-105" font-family="Helvetica,sans-Serif" font-size="10.00">cudaFlow: [0]mis_loop_end</text>
</g>
<g class="m-node m-flat">
<title>p0x55f824e15da0</title>
<ellipse cx="475.49" cy="-617" rx="52.96" ry="18"/>
<text text-anchor="middle" x="475.49" y="-614.5" font-family="Helvetica,sans-Serif" font-size="10.00">new_net_mask</text>
</g>
<g class="m-node">
<title>p0x55f824e16950</title>
<polygon points="684.11,-497 681.11,-501 660.11,-501 657.11,-497 602.11,-497 602.11,-461 684.11,-461 684.11,-497"/>
<text text-anchor="middle" x="643.11" y="-476.5" font-family="Helvetica,sans-Serif" font-size="10.00">h2d_constant</text>
</g>
<g class="m-edge">
<title>p0x55f824e15da0&#45;&gt;p0x55f824e16950</title>
<path d="M514.38,-604.73C523.84,-600.79 533.66,-595.88 542.01,-590 575.4,-566.46 605.58,-529.9 623.87,-505.23"/>
<polygon points="626.78,-507.18 629.83,-497.04 621.12,-503.06 626.78,-507.18"/>
</g>
<g class="m-node m-flat">
<title>p0x55f824e16fb0</title>
<ellipse cx="799.66" cy="-423" rx="49.4" ry="18"/>
<text text-anchor="middle" x="799.66" y="-420.5" font-family="Helvetica,sans-Serif" font-size="10.00">mis_loop_beg</text>
</g>
<g class="m-edge">
<title>p0x55f824e16950&#45;&gt;p0x55f824e16fb0</title>
<path d="M684.31,-464.43C705.82,-456.64 732.34,-447.03 754.42,-439.03"/>
<polygon points="755.7,-442.29 763.91,-435.59 753.31,-435.71 755.7,-442.29"/>
</g>
<g class="m-node m-flat">
<title>p0x55f824e160d0</title>
<ellipse cx="475.49" cy="-563" rx="46.51" ry="18"/>
<text text-anchor="middle" x="475.49" y="-560.5" font-family="Helvetica,sans-Serif" font-size="10.00">new_pin2net</text>
</g>
<g class="m-edge">
<title>p0x55f824e160d0&#45;&gt;p0x55f824e16950</title>
<path d="M513.12,-552.36C522.7,-549.13 532.89,-545.29 542.01,-541 565.01,-530.19 589.27,-515.26 608.15,-502.76"/>
<polygon points="610.34,-505.51 616.69,-497.03 606.44,-499.7 610.34,-505.51"/>
</g>
<g class="m-node">
<title>p0x55f824e170c0</title>
<polygon points="364.34,-450 361.34,-454 340.34,-454 337.34,-450 278.34,-450 278.34,-414 364.34,-414 364.34,-450"/>
<text text-anchor="middle" x="321.34" y="-429.5" font-family="Helvetica,sans-Serif" font-size="10.00">[0]mis_loop_k</text>
</g>
<g class="m-edge">
<title>p0x55f824e16fb0&#45;&gt;p0x55f824e170c0</title>
<path d="M787.9,-440.58C772.29,-465.11 741.45,-510.08 707.21,-541 643,-598.99 625.19,-620.19 542.01,-644 483.25,-660.82 454.92,-678.53 404.5,-644 343.47,-602.2 327.77,-507.99 323.73,-460.5"/>
<polygon points="327.21,-460.02 322.99,-450.3 320.23,-460.53 327.21,-460.02"/>
</g>
<g class="m-node m-flat">
<title>p0x7f4ad8000e70</title>
<ellipse cx="475.49" cy="-438" rx="45.15" ry="18"/>
<text text-anchor="middle" x="475.49" y="-435.5" font-family="Helvetica,sans-Serif" font-size="10.00">h2d_pin2net</text>
</g>
<g class="m-edge">
<title>p0x7f4ad8000e70&#45;&gt;p0x55f824e16950</title>
<path d="M514.49,-447.41C537.48,-453.1 567.08,-460.43 591.98,-466.59"/>
<polygon points="591.43,-470.06 601.98,-469.07 593.11,-463.27 591.43,-470.06"/>
</g>
<g class="m-node m-flat">
<title>p0x7f4ad8000f30</title>
<ellipse cx="475.49" cy="-384" rx="41.59" ry="18"/>
<text text-anchor="middle" x="475.49" y="-381.5" font-family="Helvetica,sans-Serif" font-size="10.00">h2d_fv2pin</text>
</g>
<g class="m-edge">
<title>p0x7f4ad8000f30&#45;&gt;p0x55f824e16950</title>
<path d="M508.09,-395.5C519.05,-399.88 531.28,-405.23 542.01,-411 565.86,-423.84 591.07,-440.99 610.23,-454.86"/>
<polygon points="608.18,-457.69 618.31,-460.77 612.31,-452.04 608.18,-457.69"/>
</g>
<g class="m-node m-flat">
<title>p0x7f4ad8001140</title>
<ellipse cx="475.49" cy="-492" rx="39.38" ry="18"/>
<text text-anchor="middle" x="475.49" y="-489.5" font-family="Helvetica,sans-Serif" font-size="10.00">h2d_pin2v</text>
</g>
<g class="m-edge">
<title>p0x7f4ad8001140&#45;&gt;p0x55f824e16950</title>
<path d="M514.49,-489.02C537.48,-487.21 567.08,-484.89 591.98,-482.93"/>
<polygon points="592.28,-486.42 601.98,-482.15 591.74,-479.44 592.28,-486.42"/>
</g>
<g class="m-node m-flat">
<title>p0x55f824e16a60</title>
<ellipse cx="58.97" cy="-97" rx="50.75" ry="18"/>
<text text-anchor="middle" x="58.97" y="-94.5" font-family="Helvetica,sans-Serif" font-size="10.00">[0]shuffle_beg</text>
</g>
<g class="m-node m-flat">
<title>p0x55f824e16b70</title>
<ellipse cx="190.16" cy="-97" rx="43.62" ry="18"/>
<text text-anchor="middle" x="190.16" y="-94.5" font-family="Helvetica,sans-Serif" font-size="10.00">[0]shuffle_k</text>
</g>
<g class="m-edge">
<title>p0x55f824e16a60&#45;&gt;p0x55f824e16b70</title>
<path d="M109.92,-97C118.59,-97 127.64,-97 136.39,-97"/>
<polygon points="136.48,-100.5 146.48,-97 136.48,-93.5 136.48,-100.5"/>
</g>
<g class="m-node m-flat">
<title>p0x55f824e16c80</title>
<ellipse cx="321.34" cy="-97" rx="50.75" ry="18"/>
<text text-anchor="middle" x="321.34" y="-94.5" font-family="Helvetica,sans-Serif" font-size="10.00">[0]shuffle_end</text>
</g>
<g class="m-edge">
<title>p0x55f824e16b70&#45;&gt;p0x55f824e16c80</title>
<path d="M233.82,-97C242.36,-97 251.49,-97 260.49,-97"/>
<polygon points="260.56,-100.5 270.56,-97 260.56,-93.5 260.56,-100.5"/>
</g>
<g class="m-node m-flat">
<title>p0x55f824e16d90</title>
<ellipse cx="475.49" cy="-97" rx="66.54" ry="18"/>
<text text-anchor="middle" x="475.49" y="-94.5" font-family="Helvetica,sans-Serif" font-size="10.00">[0]mis_parallel_beg</text>
</g>
<g class="m-edge">
<title>p0x55f824e16c80&#45;&gt;p0x55f824e16d90</title>
<path d="M372.16,-97C380.66,-97 389.66,-97 398.66,-97"/>
<polygon points="398.78,-100.5 408.78,-97 398.78,-93.5 398.78,-100.5"/>
</g>
<g class="m-node">
<title>p0x55f824e16ea0</title>
<polygon points="678.61,-223 675.61,-227 654.61,-227 651.61,-223 607.61,-223 607.61,-187 678.61,-187 678.61,-223"/>
<text text-anchor="middle" x="643.11" y="-202.5" font-family="Helvetica,sans-Serif" font-size="10.00">[0]mis_h2d</text>
</g>
<g class="m-edge">
<title>p0x55f824e16d90&#45;&gt;p0x55f824e16ea0</title>
<path d="M520.1,-110.56C527.61,-113.57 535.19,-117.06 542.01,-121 569.97,-137.18 597.79,-161.35 616.98,-179.61"/>
<polygon points="614.78,-182.35 624.4,-186.79 619.64,-177.32 614.78,-182.35"/>
</g>
<g class="m-edge">
<title>p0x55f824e16ea0&#45;&gt;p0x55f824e16fb0</title>
<path d="M668.94,-223.23C688.05,-238.21 714.17,-260.83 732.21,-285 758.11,-319.69 777.94,-366.07 788.95,-395.24"/>
<polygon points="785.73,-396.62 792.47,-404.8 792.29,-394.2 785.73,-396.62"/>
</g>
<g class="m-node m-flat">
<title>p0x7f4ad8004530</title>
<ellipse cx="475.49" cy="-205" rx="62.97" ry="18"/>
<text text-anchor="middle" x="475.49" y="-202.5" font-family="Helvetica,sans-Serif" font-size="10.00">[0]h2d_ordered_vs</text>
</g>
<g class="m-edge">
<title>p0x7f4ad8004530&#45;&gt;p0x55f824e16ea0</title>
<path d="M538.63,-205C558.12,-205 579.24,-205 597.29,-205"/>
<polygon points="597.52,-208.5 607.52,-205 597.52,-201.5 597.52,-208.5"/>
</g>
<g class="m-node m-flat">
<title>p0x7f4ad8006d10</title>
<ellipse cx="475.49" cy="-151" rx="61.62" ry="18"/>
<text text-anchor="middle" x="475.49" y="-148.5" font-family="Helvetica,sans-Serif" font-size="10.00">[0]h2d_dependent</text>
</g>
<g class="m-edge">
<title>p0x7f4ad8006d10&#45;&gt;p0x55f824e16ea0</title>
<path d="M517.43,-164.35C541.87,-172.32 572.91,-182.44 597.91,-190.59"/>
<polygon points="596.92,-193.95 607.51,-193.72 599.09,-187.29 596.92,-193.95"/>
</g>
<g class="m-node m-flat">
<title>p0x7f4ad8006df0</title>
<ellipse cx="475.49" cy="-259" rx="55.85" ry="18"/>
<text text-anchor="middle" x="475.49" y="-256.5" font-family="Helvetica,sans-Serif" font-size="10.00">[0]h2d_selected</text>
</g>
<g class="m-edge">
<title>p0x7f4ad8006df0&#45;&gt;p0x55f824e16ea0</title>
<path d="M515.32,-246.34C540.07,-238.27 572.22,-227.79 597.95,-219.4"/>
<polygon points="599.04,-222.72 607.46,-216.3 596.87,-216.07 599.04,-222.72"/>
</g>
<g class="m-node m-flat">
<title>p0x55f824e171d0</title>
<ellipse cx="475.49" cy="-330" rx="66.54" ry="18"/>
<text text-anchor="middle" x="475.49" y="-327.5" font-family="Helvetica,sans-Serif" font-size="10.00">[0]mis_loop_update</text>
</g>
<g class="m-edge">
<title>p0x55f824e170c0&#45;&gt;p0x55f824e171d0</title>
<path d="M337.27,-413.87C352.54,-396.37 377.76,-370.21 404.5,-354 408.92,-351.32 413.68,-348.89 418.56,-346.7"/>
<polygon points="420.14,-349.83 428.04,-342.78 417.46,-343.37 420.14,-349.83"/>
</g>
<g class="m-node">
<title>p0x55f824e172e0</title>
<polygon points="643.11,-348 578.91,-330 643.11,-312 707.31,-330 643.11,-348"/>
<text text-anchor="middle" x="643.11" y="-327.5" font-family="Helvetica,sans-Serif" font-size="10.00">[0]mis_cond</text>
</g>
<g class="m-edge">
<title>p0x55f824e171d0&#45;&gt;p0x55f824e172e0</title>
<path d="M542.42,-330C551.05,-330 559.92,-330 568.66,-330"/>
<polygon points="568.83,-333.5 578.83,-330 568.83,-326.5 568.83,-333.5"/>
</g>
<g class="m-node m-flat">
<title>p0x7f4ad8007e00</title>
<ellipse cx="58.97" cy="-459" rx="42.94" ry="18"/>
<text text-anchor="middle" x="58.97" y="-456.5" font-family="Helvetica,sans-Serif" font-size="10.00">[0]h2d_size</text>
</g>
<g class="m-node">
<title>p0x7f4ad8007d00</title>
<polygon points="219.66,-477 164.66,-477 160.66,-473 160.66,-441 215.66,-441 219.66,-445 219.66,-477"/>
<polyline points="215.66,-473 160.66,-473 "/>
<polyline points="215.66,-473 215.66,-441 "/>
<polyline points="215.66,-473 219.66,-477 "/>
<text text-anchor="middle" x="190.16" y="-456.5" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">[0]mis_k</text>
</g>
<g class="m-edge">
<title>p0x7f4ad8007e00&#45;&gt;p0x7f4ad8007d00</title>
<path d="M102.27,-459C117.82,-459 135.33,-459 150.53,-459"/>
<polygon points="150.64,-462.5 160.64,-459 150.64,-455.5 150.64,-462.5"/>
</g>
<g class="m-edge">
<title>p0x7f4ad8007d00&#45;&gt;p0x55f824e170c0</title>
<path d="M219.83,-453.01C233.99,-450.05 251.52,-446.38 267.96,-442.95"/>
<polygon points="268.94,-446.32 278.02,-440.85 267.51,-439.47 268.94,-446.32"/>
</g>
<g class="m-node m-flat">
<title>p0x7f4ad8007b80</title>
<ellipse cx="190.16" cy="-405" rx="42.94" ry="18"/>
<text text-anchor="middle" x="190.16" y="-402.5" font-family="Helvetica,sans-Serif" font-size="10.00">[0]d2h_size</text>
</g>
<g class="m-edge">
<title>p0x7f4ad8007b80&#45;&gt;p0x55f824e170c0</title>
<path d="M228.87,-412.88C241.22,-415.46 255.15,-418.38 268.36,-421.14"/>
<polygon points="267.77,-424.59 278.28,-423.21 269.21,-417.74 267.77,-424.59"/>
</g>
<g class="m-edge">
<title>p0x55f824e172e0&#45;&gt;p0x55f824e16fb0</title>
<path stroke-dasharray="5,2" d="M674.1,-339.44C684.84,-343.33 696.85,-348.27 707.21,-354 730.4,-366.82 754.21,-384.98 771.73,-399.45"/>
<polygon points="769.88,-402.47 779.79,-406.22 774.38,-397.11 769.88,-402.47"/>
<text text-anchor="middle" x="728.71" y="-371" font-family="Helvetica,sans-Serif" font-size="10.00">0</text>
</g>
<g class="m-node">
<title>p0x55f824e173f0</title>
<polygon points="848.66,-90 845.66,-94 824.66,-94 821.66,-90 750.66,-90 750.66,-54 848.66,-54 848.66,-90"/>
<text text-anchor="middle" x="799.66" y="-69.5" font-family="Helvetica,sans-Serif" font-size="10.00">[0]mis_loop_end</text>
</g>
<g class="m-edge">
<title>p0x55f824e172e0&#45;&gt;p0x55f824e173f0</title>
<path stroke-dasharray="5,2" d="M681.8,-322.72C691,-319.47 700.2,-314.77 707.21,-308 766.84,-250.37 788.25,-149.45 795.39,-100.39"/>
<polygon points="798.9,-100.57 796.77,-90.19 791.96,-99.63 798.9,-100.57"/>
<text text-anchor="middle" x="728.71" y="-290" font-family="Helvetica,sans-Serif" font-size="10.00">1</text>
</g>
<g class="m-node m-flat">
<title>p0x55f824e1aa20</title>
<ellipse cx="924.37" cy="-72" rx="38.03" ry="18"/>
<text text-anchor="middle" x="924.37" y="-69.5" font-family="Helvetica,sans-Serif" font-size="10.00">[0]hpwl_k</text>
</g>
<g class="m-edge">
<title>p0x55f824e173f0&#45;&gt;p0x55f824e1aa20</title>
<path d="M848.81,-72C857.69,-72 866.95,-72 875.82,-72"/>
<polygon points="875.99,-75.5 885.99,-72 875.99,-68.5 875.99,-75.5"/>
</g>
<g class="m-node m-flat">
<title>p0x55f824e1ab30</title>
<ellipse cx="1059.09" cy="-126" rx="50.07" ry="18"/>
<text text-anchor="middle" x="1059.09" y="-123.5" font-family="Helvetica,sans-Serif" font-size="10.00">del_net_mask</text>
</g>
<g class="m-edge">
<title>p0x55f824e1aa20&#45;&gt;p0x55f824e1ab30</title>
<path d="M953.84,-83.58C971.86,-90.91 995.48,-100.52 1015.68,-108.74"/>
<polygon points="1014.4,-112 1024.98,-112.53 1017.04,-105.52 1014.4,-112"/>
</g>
<g class="m-node m-flat">
<title>p0x55f824e1ac40</title>
<ellipse cx="1059.09" cy="-72" rx="45.15" ry="18"/>
<text text-anchor="middle" x="1059.09" y="-69.5" font-family="Helvetica,sans-Serif" font-size="10.00">del_fnet2pin</text>
</g>
<g class="m-edge">
<title>p0x55f824e1aa20&#45;&gt;p0x55f824e1ac40</title>
<path d="M962.69,-72C975.28,-72 989.6,-72 1003.25,-72"/>
<polygon points="1003.52,-75.5 1013.52,-72 1003.52,-68.5 1003.52,-75.5"/>
</g>
<g class="m-node m-flat">
<title>p0x55f824e1ad50</title>
<ellipse cx="1059.09" cy="-18" rx="59.41" ry="18"/>
<text text-anchor="middle" x="1059.09" y="-15.5" font-family="Helvetica,sans-Serif" font-size="10.00">del_fnet2pin_ofst</text>
</g>
<g class="m-edge">
<title>p0x55f824e1aa20&#45;&gt;p0x55f824e1ad50</title>
<path d="M953.84,-60.42C971.12,-53.38 993.56,-44.26 1013.18,-36.27"/>
<polygon points="1014.62,-39.47 1022.56,-32.46 1011.98,-32.98 1014.62,-39.47"/>
</g>
<g class="m-node m-flat">
<title>p0x7f4ad8008470</title>
<ellipse cx="643.11" cy="-72" rx="61.44" ry="18"/>
<text text-anchor="middle" x="643.11" y="-69.5" font-family="Helvetica,sans-Serif" font-size="10.00">p0x7f4ad8008470</text>
</g>
<g class="m-edge">
<title>p0x7f4ad8008470&#45;&gt;p0x55f824e173f0</title>
<path d="M704.75,-72C716.52,-72 728.84,-72 740.53,-72"/>
<polygon points="740.61,-75.5 750.61,-72 740.61,-68.5 740.61,-75.5"/>
</g>
</g>
</svg>
</div><p>The table below lists the programming effort of each method, measured by <a href="https://dwheeler.com/sloccount/">SLOCCount</a>. Taskflow outperforms TBB and StarPU in all aspects. The whole program is about 1.5x and 1.7x less complex than that of TBB and StarPU, respectively.</p><table class="m-table"><thead><tr><th>Method</th><th>Lines of Code</th><th>Number of Tokens</th><th>Cyclomatic Complexity</th><th>Cost</th></tr></thead><tbody><tr><td>Taskflow</td><td>677</td><td>4180</td><td>53</td><td>$15,054</td></tr><tr><td>TBB</td><td>1000</td><td>6415</td><td>78</td><td>$21,736</td></tr><tr><td>StarPU</td><td>1279</td><td>8136</td><td>90</td><td>$29,686</td></tr></tbody></table></section><section id="UseCasesDreamPlacePerformance"><h2><a href="#UseCasesDreamPlacePerformance">Performance</a></h2><p>Using 8 CPUs and 1 GPU, Taskflow is consistently faster than others across all problem sizes (placement iterations). The gap becomes clear at large problem size; at 100 iterations, Taskflow is 17% faster than TBB and StarPU. We observed similar results using other CPU numbers. Performance saturates at about 16 CPUs, primarily due to the inherent irregularity of the placement algorithm.</p><img class="m-image" src="dreamplace_4.png" alt="Image" /><p>The memory footprint shows the benefit of our conditional tasking. We keep nearly no growth of memory when the problem size increases, whereas StarPU and TBB grow linearly due to unrolled task graphs. At a vertical scale, increasing the number of CPUs bumps up the memory usage of all methods, but the growth rate of Taskflow is much slower than the others.</p><img class="m-image" src="dreamplace_5.png" alt="Image" /><p>In terms of energy, our scheduler is very power efficient in completing the placement workload, regardless of problem sizes and CPU numbers. Beyond 16 CPUs where performance saturates, our system does not suffer from increasing power as StarPU, due to our adaptive task scheduling algorithm.</p><img class="m-image" src="dreamplace_6.png" alt="Image" /><p>For irregular task graphs akin to this placement workload, resource utilization is critical to the system throughput. We corun the same program by up to nine processes that compete for 40 CPUs and 1 GPU. Corunning a placement program is very common for searching the best parameters for an algorithm. We plot the throughput using <em>weighted speed-up</em> across nine coruns at two problem sizes. Both Taskflow and TBB achieve higher throughput than StarPU. At the largest problem size, Taskflow outperforms TBB and StarPU across all coruns.</p><img class="m-image" src="dreamplace_7.png" alt="Image" /></section><section id="UseCasesDreamPlaceConclusion"><h2><a href="#UseCasesDreamPlaceConclusion">Conclusion</a></h2><p>We have observed two significant benefits of Taskflow over existing programming systems. The first benefit is our conditional tasking. Condition tasks encode control-flow decisions directly in a cyclic task graph rather than unrolling it statically across iterations, saving a lot of memory usage. The second benefit is our runtime scheduler. Our scheduler is able to adapt the number of worker threads to available task parallelism at any time during the graph execution, providing improved performance, power efficiency, and system throughput.</p></section><section id="UseCasesDreamPlaceReferences"><h2><a href="#UseCasesDreamPlaceReferences">References</a></h2><ul><li>Yibo Lin, Wuxi Li, Jiaqi Gu, Haoxing Ren, Brucek Khailany and David Z. Pan, &quot;<a href="https://ieeexplore.ieee.org/document/8982049">ABCDPlace: Accelerated Batch-based Concurrent Detailed Placement on Multi-threaded CPUs and GPUs</a>,&quot; <em>IEEE Transactions on Computer-aided Design of Integrated Circuits and Systems (TCAD)</em>, vol. 39, no. 12, pp. 5083-5096, Dec. 2020</li><li>Yibo Lin, Shounak Dhar, Wuxi Li, Haoxing Ren, Brucek Khailany and David Z. Pan, &quot;<a href="lin_19_01.pdf">DREAMPlace: Deep Learning Toolkit-Enabled GPU Acceleration for Modern VLSI Placement</a>&quot;, <em>ACM/IEEE Design Automation Conference (DAC)</em>, Las Vegas, NV, Jun 2-6, 2019</li></ul></section>
      </div>
    </div>
  </div>
</article></main>
<div class="m-doc-search" id="search">
  <a href="#!" onclick="return hideSearch()"></a>
  <div class="m-container">
    <div class="m-row">
      <div class="m-col-m-8 m-push-m-2">
        <div class="m-doc-search-header m-text m-small">
          <div><span class="m-label m-default">Tab</span> / <span class="m-label m-default">T</span> to search, <span class="m-label m-default">Esc</span> to close</div>
          <div id="search-symbolcount">&hellip;</div>
        </div>
        <div class="m-doc-search-content">
          <form>
            <input type="search" name="q" id="search-input" placeholder="Loading &hellip;" disabled="disabled" autofocus="autofocus" autocomplete="off" spellcheck="false" />
          </form>
          <noscript class="m-text m-danger m-text-center">Unlike everything else in the docs, the search functionality <em>requires</em> JavaScript.</noscript>
          <div id="search-help" class="m-text m-dim m-text-center">
            <p class="m-noindent">Search for symbols, directories, files, pages or
            modules. You can omit any prefix from the symbol or file path; adding a
            <code>:</code> or <code>/</code> suffix lists all members of given symbol or
            directory.</p>
            <p class="m-noindent">Use <span class="m-label m-dim">&darr;</span>
            / <span class="m-label m-dim">&uarr;</span> to navigate through the list,
            <span class="m-label m-dim">Enter</span> to go.
            <span class="m-label m-dim">Tab</span> autocompletes common prefix, you can
            copy a link to the result using <span class="m-label m-dim">⌘</span>
            <span class="m-label m-dim">L</span> while <span class="m-label m-dim">⌘</span>
            <span class="m-label m-dim">M</span> produces a Markdown link.</p>
          </div>
          <div id="search-notfound" class="m-text m-warning m-text-center">Sorry, nothing was found.</div>
          <ul id="search-results"></ul>
        </div>
      </div>
    </div>
  </div>
</div>
<script src="search-v2.js"></script>
<script src="searchdata-v2.js" async="async"></script>
<footer><nav>
  <div class="m-container">
    <div class="m-row">
      <div class="m-col-l-10 m-push-l-1">
        <p>Taskflow handbook is part of the <a href="https://taskflow.github.io">Taskflow project</a>, copyright © <a href="https://tsung-wei-huang.github.io/">Dr. Tsung-Wei Huang</a>, 2018&ndash;2023.<br />Generated by <a href="https://doxygen.org/">Doxygen</a> 1.9.1 and <a href="https://mcss.mosra.cz/">m.css</a>.</p>
      </div>
    </div>
  </div>
</nav></footer>
</body>
</html>
